home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / hardware / summa / io / summa.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  40.1 KB  |  1,506 lines

  1. /*
  2.  * Copyright (C) 1990, 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #ident "$Revision: 1.0 $"
  18.  
  19. #include <bstring.h>
  20.  
  21. #ifdef INPUT_TEST
  22. #define _KERNEL
  23. #include <sys/types.h>
  24. #undef _KERNEL
  25. #endif
  26.  
  27. #include <sys/ioctl.h>
  28. #include <sys/errno.h>
  29. #include <sys/termio.h>
  30. #include <sys/cmn_err.h>
  31. #include <sys/debug.h>
  32. #include <sys/param.h>
  33. #include <sys/kmem.h>
  34. #include <sys/mload.h>
  35. #include <string.h>
  36.  
  37. /* Streams stuff */
  38. #include "sys/stream.h"
  39. #include "sys/strids.h"
  40. #include "sys/stropts.h"
  41.  
  42. #ifdef INPUT_TEST
  43. #include <stdio.h>
  44. #include "inputtest.h"
  45. #define    _KERNEL
  46. #else
  47. #include "sys/systm.h"
  48. #endif /* INPUT_TEST */
  49.  
  50. /* my stuff */
  51. #include "sys/shmiq.h"
  52. #include "sys/idev.h"
  53. #include "sys/summa.h"
  54.  
  55. #include <sys/ddi.h>
  56.  
  57. #ifndef NULL
  58. #define NULL 0
  59. #endif
  60.  
  61.  
  62. #ifndef isdigit
  63. #define    isdigit(c)    (((c)>='0')&&((c)<='9'))
  64. #endif
  65.  
  66. #define    DBGLEVEL    0    /* Use this to control the printing of
  67.                  * debugging messages.  Set to 0 for
  68.                  * no messages (i.e. actual use).  Set
  69.                  * to 1 for highest level messages.
  70.                  * Higher number shows more detailed
  71.                  * messages.  Max is 4
  72.                  */
  73.  
  74.     /*
  75.      * Macros and variables specific to Summagraphics
  76.      * go here
  77.      */
  78.  
  79. static idevDesc _sum_desc = {
  80.     SUMMA_NAME,        /* devName */
  81.     SUMMA_TYPE,        /* devType */
  82.     SUMMA_NUM_BUTTONS,    /* nButtons */
  83.     SUMMA_NUM_VALUATORS,    /* nValuators */
  84.     0,            /* nLEDs */
  85.     0,            /* nStrDpys */
  86.     0,            /* nIntDpys */
  87.     0,            /* nBells */
  88.     0            /* flags */
  89. };
  90.  
  91. static idevValuatorDesc _sum_x_val_desc = {
  92.     SUMMA_VALUATOR_MIN_RESOLUTION,    /* hwMinRes */
  93.     SUMMA_VALUATOR_MAX_RESOLUTION,    /* hwMaxRes */
  94.     SUMMA_X_VALUATOR_MIN,        /* hwMinVal */
  95.     SUMMA_X_VALUATOR_MAX,        /* hwMaxVal */
  96.     IDEV_ABSOLUTE,            /* possibleModes */
  97.     IDEV_ABSOLUTE,            /* mode */
  98.     SUMMA_VALUATOR_RESOLUTION,    /* resolution */
  99.     SUMMA_X_VALUATOR_MIN,        /* minVal */
  100.     SUMMA_X_VALUATOR_MAX        /* maxVal */
  101. };
  102.  
  103. static idevValuatorDesc _sum_y_val_desc = {
  104.     SUMMA_VALUATOR_MIN_RESOLUTION,    /* hwMinRes */
  105.     SUMMA_VALUATOR_MAX_RESOLUTION,    /* hwMaxRes */
  106.     SUMMA_Y_VALUATOR_MIN,        /* hwMinVal */
  107.     SUMMA_Y_VALUATOR_MAX,        /* hwMaxVal */
  108.     IDEV_ABSOLUTE,            /* possibleModes */
  109.     IDEV_ABSOLUTE,            /* mode */
  110.     SUMMA_VALUATOR_RESOLUTION,    /* resolution */
  111.     SUMMA_Y_VALUATOR_MIN,        /* minVal */
  112.     SUMMA_Y_VALUATOR_MAX        /* maxVal */
  113. };
  114.  
  115.  
  116.  
  117. char    dbg_str[50];
  118.  
  119. void
  120. dbg_print(char *str)
  121. {
  122.     cmn_err(CE_DEBUG,str);
  123. }
  124.  
  125. static void
  126. sum_intr( idevInfo *pInfo, unsigned char *str, int len )
  127. {
  128. sum_state_t *sum= (sum_state_t *)pInfo;
  129. unsigned char mask;
  130. unsigned char state_val;
  131. int config_info = 0;
  132. static unsigned char state[8];
  133.  
  134. if (sum->info.bInfo.nBtn == 4) {        /* 4 button puck */
  135.     state[0] = 0;        /* no buttons pressed */
  136.     state[1] = 1;        /* button 0 (labeled 1) pressed */
  137.     state[2] = 2;        /* button 1 (labeled 2) pressed */
  138.     state[3] = 4;        /* button 2 (labeled 3) pressed */
  139.     state[4] = 8;        /* button 3 (labeled 4) pressed */
  140.     state[5] = 0x09;    /* buttons 0 & 3 pressed */
  141.     state[6] = 0x0A;    /* buttons 1 & 3 pressed */
  142.     state[7] = 0x0C;    /* buttons 2 & 3 pressed */
  143. }
  144. else if (sum->info.bInfo.nBtn == 2)  {         /* Stylus */     
  145.     state[0] = 0;        /* invalid state */
  146.     state[1] = 0;        /* invalid state */
  147.     state[2] = 0;        /* invalid state */
  148.     state[3] = 0;        /* invalid state */
  149.     state[4] = 0;        /* no buttons pressed */
  150.     state[5] = 1;        /* button 0 (tip button) pressed */
  151.     state[6] = 2;        /* button 1 (barrel button) pressed */
  152.     state[7] = 3;        /* buttons 0 & 1 pressed */
  153. }
  154. else  {                        /* 5 button puck */
  155.     state[0] = 0;        /* no buttons pressed */
  156.     state[1] = 0x10;    /* button 4 (on side of puck) pressed */
  157.     state[2] = 8;        /* button 3 (labeled 4) pressed */
  158.     state[3] = 4;        /* button 2 (labeled 3) pressed */
  159.     state[4] = 2;        /* button 1 (labeled 2) pressed */
  160.     state[5] = 1;        /* button 0 (labeled 1) pressed */
  161.     state[6] = 0;        /* invalid state */    
  162.     state[7] = 0;        /* invalid state */
  163. }
  164.  
  165.  
  166. /*
  167. =======================================================================
  168.     Summagraphics Tablet Output Format -
  169.       (i.e. MM Packed Binary Report Format )
  170.   
  171.   For Regular or Config Data:
  172.  
  173.     MSB                       LSB    Byte   Byte
  174.      7    6    5    4    3    2    1    0      #     Name
  175.     ------------------------------------------------------
  176.      PH   PR   T    Sx   Sy   Fc   Fb   Fa     0     FLAGS
  177.      0    X6   X5   X4   X3   X2   X1   X0     1     LOW_X
  178.      0    X13  X12  X11  X10  X9   X8   X7     2     HIGH_X
  179.          0    Y6   Y5   Y4   Y3   Y2   Y1   Y0     3     LOW_Y
  180.          0    Y13  Y12  Y11  Y10  Y9   Y8   Y7     4     HIGH_Y
  181.  
  182.   For Delta (relative) Data:
  183.  
  184.     MSB                       LSB    Byte   Byte
  185.      7    6    5    4    3    2    1    0      #     Name
  186.     ------------------------------------------------------
  187.      PH   PR   T    Sx   Sy   Fc   Fb   Fa     0     FLAGS
  188.      0    X6   X5   X4   X3   X2   X1   X0     1     LOW_X
  189.          0    Y6   Y5   Y4   Y3   Y2   Y1   Y0     3     HIGH_X
  190.  
  191.     Where:
  192.  
  193.         Fx - Flag bit signifying stylus or cursor button number
  194.  
  195.         Sx or Sy - sign bit for X or Y: 1 is positive, 0 is negative
  196.                (set to 1 for config data)
  197.  
  198.         T - Tablet identifier, choice of 0 or 1
  199.  
  200.         PH - Phasing bit, always 1
  201.  
  202.         PR - Proximity: 0 is "in" proximity, 1 is "out" of proximity
  203.          (set to 0 for config data)
  204.  
  205.         X0 to X13 - X coordinate (or maximum X value at set resolution
  206.             for config data)
  207.  
  208.         Y0 to Y13 - Y coordinate (or maximum Y value at set resolution
  209.                         for config data)
  210.  
  211.   For Test Result Data:
  212.  
  213.     MSB                       LSB    Byte   Byte
  214.      7    6    5    4    3    2    1    0      #     Name
  215.     ------------------------------------------------------
  216.      T    0    0    0    PR   D    C    A      0     FLAGS
  217.     
  218.     Where:
  219.  
  220.         A    analog circuitry test; pass = 1, fail = 0
  221.  
  222.         C    cursor/stylous connection and cursor/stylus coil
  223.         operation test; pass = 1, fail = 0
  224.  
  225.         D    digital circuitry test: pass = 1, fail = 0
  226.  
  227.         PR    cursor/stylus on/off tablet; on = 1, off = 0
  228.  
  229.         T    total test result; pass = 1, fail = 0
  230.  
  231.   For Checksum Data:
  232.  
  233.     Six bytes of data in the format:
  234.  
  235.     .#HHHH
  236.  
  237.     Where:
  238.  
  239.         HHHH   a hexidecimal number in ascii
  240.  
  241.  
  242. =======================================================================
  243. */
  244.     while (len--) {
  245.     if (sum->state==SUMMA_NOT_SYNCHED) {
  246.         if (!(*str & SUMMA_PHASE_BIT)) {
  247.             str++;
  248.             continue;
  249.         }
  250.         else sum->state= SUMMA_FLAGS;
  251.     }
  252.     else if ((sum->state==SUMMA_FLAGS)&&(! (*str&SUMMA_PHASE_BIT))) {
  253.         sum->state= SUMMA_NOT_SYNCHED;
  254. #if DBGLEVEL == 4
  255.             sprintf(dbg_str,"tablet out of sync\n"); 
  256.             dbg_print(dbg_str);
  257. #endif
  258.         str++;
  259.         continue;
  260.     }
  261.     switch (sum->data) {
  262.         case SUMMA_REGULAR_DATA:
  263. #if DBGLEVEL >= 2
  264.             sprintf(dbg_str,"regular data\n"); 
  265.             dbg_print(dbg_str);
  266. #endif
  267. #if DBGLEVEL == 4
  268.         cmn_err(CE_DEBUG,"Byte 0 is: %x\n",*str);
  269.         *str++;
  270.         cmn_err(CE_DEBUG,"Byte 1 is: %x\n",*str);
  271.         *str++;
  272.         cmn_err(CE_DEBUG,"Byte 2 is: %x\n",*str);
  273.         *str++;
  274.         cmn_err(CE_DEBUG,"Byte 3 is: %x\n",*str);
  275.         *str++;
  276.         cmn_err(CE_DEBUG,"Byte 4 is: %x\n",*str);
  277.         *str++;
  278.         cmn_err(CE_DEBUG,"Byte 5 is: %x\n",*str);
  279.         *str--;
  280.         *str--;
  281.         *str--;
  282.         *str--;
  283.         *str--;
  284. #endif
  285.         
  286.         switch (sum->state++) {
  287.             case SUMMA_FLAGS:
  288.             sum->flags= *str++;
  289.             break;
  290.                 case SUMMA_LOW_X:
  291.                 sum->vals.value[0]= (*str++)&0x7f;
  292.             break;
  293.                 case SUMMA_HIGH_X:
  294.             sum->vals.value[0]|= ((*str++)&0x7f)<<7;
  295.             if (!((sum->flags)&0x10))
  296.                     sum->vals.value[0] = -(sum->vals.value[0]);
  297.             break;
  298.                 case SUMMA_LOW_Y:
  299.             sum->vals.value[1]= (*str++)&0x7f;
  300.             break;
  301.                 case SUMMA_HIGH_Y:
  302.             sum->vals.value[1]|= ((*str++)&0x7f)<<7;
  303.             if (!((sum->flags)&0x08))
  304.                     sum->vals.value[1] = -(sum->vals.value[1]);
  305.  
  306.             sum->vals.value[0] -= sum->xoffset;
  307.             sum->vals.value[1] -= sum->yoffset;
  308.  
  309.             mask = 0x1f;    
  310.             state_val = state[sum->flags&0x07];
  311.  
  312.                       idevGenValEvents(&sum->info,&sum->vals,IDEV_VALS_ABSOLUTE);
  313.                 idevGenBtnEvents(&sum->info,&mask,&state_val);
  314. #if DBGLEVEL >= 2
  315.             sprintf(dbg_str,"Valuator (X): %d\n", sum->vals.value[0]); 
  316.             dbg_print(dbg_str);
  317.             sprintf(dbg_str,"Valuator (Y): %d\n", sum->vals.value[1]);  
  318.             dbg_print(dbg_str);
  319. #endif
  320. #if DBGLEVEL >= 3
  321.             sprintf(dbg_str,"Button Flags: %x\n", sum->flags&0x07);  
  322.             dbg_print(dbg_str);
  323.             sprintf(dbg_str,"Flags: %x\n", sum->flags);   
  324.             dbg_print(dbg_str);
  325.             sprintf(dbg_str,"state_val: %x\n", state_val);     
  326.             dbg_print(dbg_str);
  327. #endif
  328.  
  329.             sum->state=    SUMMA_FLAGS;
  330.             break;
  331.                 default:
  332.             cmn_err(CE_WARN,"Illegal tablet state %d!!\n",sum->state);
  333.             sum->state=    SUMMA_NOT_SYNCHED;
  334.             break;
  335.         }
  336.         break;    
  337.         case SUMMA_DELTA_DATA: 
  338. #if DBGLEVEL >= 2
  339.             sprintf(dbg_str,"delta data\n"); 
  340.             dbg_print(dbg_str);
  341. #endif
  342.         switch (sum->state++) {
  343.             case SUMMA_FLAGS:
  344.             cmn_err(CE_DEBUG,"Byte 0 is: %x\n",*str);
  345.             sum->flags= *str++;
  346.             break;
  347.                 case SUMMA_LOW_X:
  348.             cmn_err(CE_DEBUG,"Byte 1 is: %x\n",*str);
  349.                 sum->vals.value[0]= (*str++)&0x7f;
  350.             if (!((sum->flags)&0x10))
  351.                     sum->vals.value[0] = -(sum->vals.value[0]);
  352.             break;
  353.                 case SUMMA_HIGH_X:
  354.             cmn_err(CE_DEBUG,"Byte 2 is: %x\n",*str);
  355.                 sum->vals.value[1]= (*str++)&0x7f;
  356.             if (!((sum->flags)&0x08))
  357.                     sum->vals.value[1] = -(sum->vals.value[1]);
  358.  
  359.             mask = 0x1f;    
  360.             state_val = state[sum->flags&0x07];
  361.  
  362.                       idevGenValEvents(&sum->info,&sum->vals,IDEV_VALS_ABSOLUTE);
  363.                 idevGenBtnEvents(&sum->info,&mask,&state_val);
  364. #if DBGLEVEL >= 2
  365.             sprintf(dbg_str,"Valuator Delta (X): %d\n", sum->vals.value[0]); 
  366.             dbg_print(dbg_str);
  367.             sprintf(dbg_str,"Valuator Delta (Y): %d\n", sum->vals.value[1]);  
  368.             dbg_print(dbg_str);
  369. #endif
  370. #if DBGLEVEL >= 3
  371.             sprintf(dbg_str,"Button Flags: %x\n", sum->flags&0x07);  
  372.             dbg_print(dbg_str);
  373.             sprintf(dbg_str,"Flags: %x\n", sum->flags);   
  374.             dbg_print(dbg_str);
  375.             sprintf(dbg_str,"state_val: %x\n", state_val);     
  376.             dbg_print(dbg_str);
  377. #endif
  378.             sum->state=    SUMMA_FLAGS;
  379.             break;
  380.                 default:
  381.             cmn_err(CE_WARN,"Illegal tablet state %d!!\n",sum->state);
  382.             sum->state=    SUMMA_NOT_SYNCHED;
  383.             break;
  384.         }   
  385.         break;
  386.         case SUMMA_CONFIG_INFO:
  387. #if DBGLEVEL >= 2
  388.             sprintf(dbg_str,"config data\n"); 
  389.             dbg_print(dbg_str);
  390. #endif
  391.         switch (sum->state++) {
  392.             case SUMMA_FLAGS:
  393.             sum->flags= *str++;
  394.             break;
  395.                 case SUMMA_LOW_X:
  396.                 sum->x_resolution = (*str++)&0x7f;
  397.             break;
  398.                 case SUMMA_HIGH_X:
  399.             sum->x_resolution |= ((*str++)&0x7f)<<7;
  400.             break;
  401.                 case SUMMA_LOW_Y:
  402.             sum->y_resolution = (*str++)&0x7f;
  403.             break;
  404.                 case SUMMA_HIGH_Y:
  405.             sum->y_resolution |= ((*str++)&0x7f)<<7;
  406.  
  407. #if DBGLEVEL >= 2
  408.             sprintf(dbg_str,"X Resolution: %d\n", sum->x_resolution); 
  409.             dbg_print(dbg_str);
  410.             sprintf(dbg_str,"Y Resolution: %d\n", sum->y_resolution);  
  411.             dbg_print(dbg_str);
  412. #endif
  413. #if DBGLEVEL >= 3
  414.             sprintf(dbg_str,"Flags: %x\n", sum->flags);   
  415.             dbg_print(dbg_str);
  416. #endif
  417.  
  418.             sum->state=    SUMMA_FLAGS;
  419.             sum->data = SUMMA_REGULAR_DATA;
  420.             break;
  421.                 default:
  422.             cmn_err(CE_WARN,"Illegal tablet state %d!!\n",sum->state);
  423.             sum->state=    SUMMA_NOT_SYNCHED;
  424.             break;
  425.         }
  426.         
  427.         break;
  428.         default:
  429.         cmn_err(CE_WARN,"Illegal tablet state %d!!\n",sum->state);
  430.         sum->state=    SUMMA_NOT_SYNCHED;
  431.         break;
  432.         }
  433.     }
  434.     return;
  435. }
  436.  
  437.  
  438. static int
  439. sum_command( sum_state_t *sum, unsigned char *command )
  440. {
  441.  
  442. #if DBGLEVEL >= 1
  443.         sprintf(dbg_str,"sum_command - subroutine started.\n");
  444.     dbg_print(dbg_str);
  445. #endif
  446. #if DBGLEVEL >= 3
  447.         sprintf(dbg_str,"sum_command - command: %s \n", command);
  448.     dbg_print(dbg_str);
  449.         sprintf(dbg_str,"sum_command - command length: %d \n", 
  450.                         strlen(command));
  451.     dbg_print(dbg_str);
  452. #endif
  453.         if (idevChangeLineSettings(&sum->info,NULL)) {
  454.                 mblk_t *mbp;
  455.  
  456.                 if (mbp= allocb(strlen(command),BPRI_MED)) {
  457.                         strcpy(mbp->b_wptr,command);
  458.                         mbp->b_wptr+=   strlen(mbp->b_wptr);
  459.                         putnext( sum->info.sInfo.wq, mbp );
  460. #if DBGLEVEL >= 2            
  461.                 sprintf(dbg_str,"sum_command - message sent.\n");
  462.             dbg_print(dbg_str);
  463. #endif
  464.                 }
  465.                 else {
  466.                         cmn_err(CE_WARN,"Couldn't allocate streams buffer -- command not completed.\n");
  467.                 }
  468.         }
  469.         return 0;
  470. }
  471.  
  472. #define SUM_RESET    "\040hQAI\040G\040c0"
  473.  
  474. static int
  475. sum_reset( sum_state_t *sum)
  476. {
  477.  
  478. #if DBGLEVEL >= 1
  479.         sprintf(dbg_str,"sum_reset - subroutine started.\n");
  480.     dbg_print(dbg_str);
  481. #endif
  482.         if (idevChangeLineSettings(&sum->info,NULL)) {
  483.                 mblk_t *mbp;
  484.  
  485.                 if (mbp= allocb(strlen(SUM_RESET),BPRI_MED)) {
  486.                         strcpy(mbp->b_wptr,SUM_RESET);
  487.                         mbp->b_wptr+=   strlen(mbp->b_wptr);
  488.                         putnext( sum->info.sInfo.wq, mbp );
  489. #if DBGLEVEL >= 2
  490.                 sprintf(dbg_str,"Tablet reset.\n");
  491.             dbg_print(dbg_str);
  492. #endif
  493.                 }
  494.                 else {
  495.                         cmn_err(CE_WARN,"Couldn't allocate streams buffer -- command not completed.\n");
  496.                 }
  497.         }
  498.         return 0;
  499. }
  500.  
  501. /* ARGSUSED */
  502. static int
  503. sum_other_control(sum_state_t *sum, idevOtherControl *pCtrl)
  504. {
  505.  
  506. char sum_string[20], origin, sum_arg[2];
  507. int  x_res_low, x_res_hi, y_res_low, y_res_hi; 
  508. int  x_res, y_res, update_value;
  509. int  x_lpi, y_lpi;
  510. char *p;
  511.  
  512. #if DBGLEVEL >= 1
  513.         sprintf(dbg_str,"In other control routine.\n");
  514.     dbg_print(dbg_str);
  515. #endif
  516.  
  517.     /* implement other device controls here */
  518.     pCtrl->name[IDEV_CTRL_NAME_LEN]= '\0';
  519.     pCtrl->data[IDEV_CTRL_DATA_LEN]= '\0';
  520.     if (strcmp(pCtrl->name,"model")==0) {
  521. #if DBGLEVEL >= 2
  522.        sprintf(dbg_str,"model\n");
  523.        dbg_print(dbg_str);
  524. #endif
  525.            if (strcmp(pCtrl->data,"961")==0) {
  526.         sum->model = 961;
  527. #if DBGLEVEL >= 3
  528.         sprintf(dbg_str,"model is 961\n");
  529.             dbg_print(dbg_str);
  530. #endif
  531.        }
  532.            else if (strcmp(pCtrl->data,"1201")==0) {
  533.         sum->model = 1201;
  534. #if DBGLEVEL >= 3
  535.         sprintf(dbg_str,"model is 1201\n");
  536.             dbg_print(dbg_str);
  537. #endif
  538.        }
  539.        else
  540.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  541.     }
  542.     else if (strcmp(pCtrl->name,"coordinate")==0) {
  543. #if DBGLEVEL >= 2
  544.        sprintf(dbg_str,"coordinate\n");
  545.        dbg_print(dbg_str);
  546. #endif
  547.            if (strcmp(pCtrl->data,"absolute")==0)  {
  548.         sum->mode_modifier = SUMMA_ABSOLUTE;
  549.         sum->data = SUMMA_REGULAR_DATA;
  550.         sum_arg[0] = SUMMA_ABSOLUTE;
  551.         sum_arg[1] = '\0';
  552. #if DBGLEVEL >= 3
  553.         sprintf(dbg_str,"absolute\n");
  554.             dbg_print(dbg_str);
  555. #endif
  556.         sum_command(sum,sum_arg);
  557.        }
  558.            else if (strcmp(pCtrl->data,"relative")==0) {
  559.         sum->data = SUMMA_DELTA_DATA;
  560.         sum->mode_modifier = SUMMA_RELATIVE;
  561.         sum_arg[0] = SUMMA_RELATIVE;
  562.         sum_arg[1] = '\0';
  563. #if DBGLEVEL >= 3
  564.         sprintf(dbg_str,"relative\n");
  565.             dbg_print(dbg_str);
  566. #endif
  567.         sum_command(sum,sum_arg);
  568.        }
  569.        else
  570.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  571.     }
  572.  
  573.     else if (strcmp(pCtrl->name,"origin")==0) {
  574. #if DBGLEVEL >= 2
  575.        sprintf(dbg_str,"origin\n");
  576.        dbg_print(dbg_str);
  577. #endif
  578.            if (strcmp(pCtrl->data,"upper")==0) {
  579.         sum->origin = SUMMA_ORIGIN_UPPER;
  580.         sum_arg[0] = SUMMA_ORIGIN_UPPER;
  581.         sum_arg[1] = '\0';
  582. #if DBGLEVEL >= 3
  583.         sprintf(dbg_str,"origin-upper\n");
  584.             dbg_print(dbg_str);
  585. #endif
  586.         sum_command(sum,sum_arg);
  587.        }
  588.        else if (strcmp(pCtrl->data,"lower")==0) {
  589.         sum->origin = SUMMA_ORIGIN_LOWER;
  590.         sum_arg[0] = SUMMA_ORIGIN_LOWER;
  591.         sum_arg[1] = '\0';
  592. #if DBGLEVEL >= 3
  593.         sprintf(dbg_str,"origin: %c\n", origin);
  594.         dbg_print(dbg_str);
  595.         sprintf(dbg_str,"origin-lower\n");
  596.             dbg_print(dbg_str);
  597. #endif
  598.         sum_command(sum,sum_arg);
  599.        }
  600.        else
  601.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  602.         }
  603.  
  604.     else if (strcmp(pCtrl->name,"reporting")==0) {
  605. #if DBGLEVEL >= 2
  606.        sprintf(dbg_str,"reporting\n");
  607.        dbg_print(dbg_str);
  608. #endif
  609.            if (strcmp(pCtrl->data,"point")==0) { 
  610.         sum->primary_mode = SUMMA_RPT_POINT;
  611.         sum_arg[0] = SUMMA_RPT_POINT;
  612.         sum_arg[1] = '\0';
  613. #if DBGLEVEL >= 3
  614.         sprintf(dbg_str,"reporting-point\n");
  615.             dbg_print(dbg_str);
  616. #endif
  617.         sum_command(sum,sum_arg);
  618.         }
  619.        else if (strcmp(pCtrl->data,"remote-mode")==0)  {
  620.         sum->primary_mode = SUMMA_RPT_REM_MODE;
  621.         sum_arg[0] = SUMMA_RPT_REM_MODE;
  622.         sum_arg[1] = '\0';
  623. #if DBGLEVEL >= 3
  624.         sprintf(dbg_str,"reporting-remote-mode\n");
  625.             dbg_print(dbg_str);
  626. #endif
  627.         sum_command(sum,sum_arg);
  628.         }
  629.        else if (strcmp(pCtrl->data,"remote-trig")==0)  {
  630.         sum_arg[0] = SUMMA_RPT_REM_TRIG;
  631.         sum_arg[1] = '\0';
  632. #if DBGLEVEL >= 3
  633.         sprintf(dbg_str,"reporting-remote-trig\n");
  634.             dbg_print(dbg_str);
  635. #endif
  636.         sum_command(sum,sum_arg);
  637.         }
  638.        else if (strcmp(pCtrl->data,"stream")==0)  {
  639.         sum->primary_mode = SUMMA_RPT_STREAM;
  640.         sum_arg[0] = SUMMA_RPT_STREAM;
  641.         sum_arg[1] = '\0';
  642. #if DBGLEVEL >= 3
  643.         sprintf(dbg_str,"reporting-stream\n");
  644.             dbg_print(dbg_str);
  645. #endif
  646.         sum_command(sum,sum_arg);
  647.         }
  648.        else if (strcmp(pCtrl->data,"switch")==0)  {
  649.         sum->primary_mode = SUMMA_RPT_SW_STREAM;
  650.         sum_arg[0] = SUMMA_RPT_SW_STREAM;
  651.         sum_arg[1] = '\0';
  652. #if DBGLEVEL >= 3
  653.         sprintf(dbg_str,"reporting-switch\n");
  654.             dbg_print(dbg_str);
  655. #endif
  656.         sum_command(sum,sum_arg);
  657.         }
  658.        else
  659.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  660.         }
  661.  
  662.     else if (strcmp(pCtrl->name,"axis_update")==0) {
  663. #if DBGLEVEL >= 2
  664.        sprintf(dbg_str,"axis_update\n");
  665.        dbg_print(dbg_str);
  666. #endif
  667.        update_value = atoi (pCtrl->data);
  668.        if (update_value >= 0 && update_value <= 90) {
  669.            update_value = update_value + 32;
  670.         sum->mode_modifier = SUMMA_AXIS_UPDATE;
  671.         sprintf(sum_string, "%c%c", SUMMA_AXIS_UPDATE,
  672.             update_value);
  673. #if DBGLEVEL >= 3
  674.         sprintf(dbg_str,"Axis update value: %d\n", update_value);
  675.             dbg_print(dbg_str);
  676.                 sprintf(dbg_str,"Axis update command: %s\n", sum_string);
  677.             dbg_print(dbg_str);
  678. #endif
  679.         sum_command(sum,sum_string); 
  680.        }
  681.        else
  682.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  683.     }
  684.  
  685.     else if (strcmp(pCtrl->name,"increment")==0) {
  686. #if DBGLEVEL >= 2
  687.        sprintf(dbg_str,"increment\n");
  688.        dbg_print(dbg_str);
  689. #endif
  690.        update_value = atoi (pCtrl->data);
  691.        if (update_value >= 0 && update_value <= 90) {
  692.            update_value = update_value + 32;
  693.         sum->mode_modifier = SUMMA_INCREMENT;
  694.         sprintf(sum_string, "%c%c", SUMMA_INCREMENT,
  695.             update_value);
  696. #if DBGLEVEL >= 3
  697.         sprintf(dbg_str,"Increment value: %d\n", update_value);
  698.             dbg_print(dbg_str);
  699.                 sprintf(dbg_str,"Increment command: %s\n", sum_string);
  700.             dbg_print(dbg_str);
  701. #endif
  702.         sum_command(sum,sum_string); 
  703.        }
  704.        else
  705.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  706.     }
  707.  
  708.     else if (strcmp(pCtrl->name,"rate")==0) {
  709. #if DBGLEVEL >= 2
  710.        sprintf(dbg_str,"rate\n");
  711.        dbg_print(dbg_str);
  712. #endif
  713.            if (strcmp(pCtrl->data,"max")==0) {
  714.         sum_arg[0] = SUMMA_RATE_MAX;
  715.         sum_arg[1] = '\0';
  716. #if DBGLEVEL >= 3
  717.         sprintf(dbg_str,"rate-max\n");
  718.         dbg_print(dbg_str);
  719. #endif
  720.         sum_command(sum,sum_arg);
  721.        }
  722.        else if (strcmp(pCtrl->data,"max/2")==0) {
  723.         sum_arg[0] = SUMMA_RATE_MAX_2;
  724.         sum_arg[1] = '\0';
  725. #if DBGLEVEL >= 3
  726.         sprintf(dbg_str,"rate-max/2\n");
  727.         dbg_print(dbg_str);
  728. #endif
  729.         sum_command(sum,sum_arg);
  730.        }
  731.        else if (strcmp(pCtrl->data,"max/8")==0) {
  732.         sum_arg[0] = SUMMA_RATE_MAX_8;
  733.         sum_arg[1] = '\0';
  734. #if DBGLEVEL >= 3
  735.         sprintf(dbg_str,"rate-max/8\n");
  736.         dbg_print(dbg_str);
  737. #endif
  738.         sum_command(sum,sum_arg);
  739.        }
  740.        else if (strcmp(pCtrl->data,"max/32")==0) {
  741.         sum_arg[0] = SUMMA_RATE_MAX_32;
  742.         sum_arg[1] = '\0';
  743. #if DBGLEVEL >= 3
  744.         sprintf(dbg_str,"rate-max/32\n");
  745.         dbg_print(dbg_str);
  746. #endif
  747.         sum_command(sum,sum_arg);
  748.        }
  749.        else
  750.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  751.         }
  752.  
  753.     else if (strcmp(pCtrl->name,"resolution")==0) {
  754. #if DBGLEVEL >= 2
  755.        sprintf(dbg_str,"resolution\n");
  756.        dbg_print(dbg_str);
  757. #endif
  758.            if (strcmp(pCtrl->data,"1lpi")==0) {
  759.         sum_arg[0] = SUMMA_RES_1LPI;
  760.         sum_arg[1] = '\0';
  761. #if DBGLEVEL >= 3
  762.         sprintf(dbg_str,"res-1lpi\n");
  763.         dbg_print(dbg_str);
  764. #endif
  765.         sum_command(sum,sum_arg);
  766.        }
  767.        else if (strcmp(pCtrl->data,"2lpi")==0) {
  768.         sum_arg[0] = SUMMA_RES_2LPI;
  769.         sum_arg[1] = '\0';
  770. #if DBGLEVEL >= 3
  771.         sprintf(dbg_str,"res-2lpi\n");
  772.         dbg_print(dbg_str);
  773. #endif
  774.         sum_command(sum,sum_arg);
  775.        }
  776.        else if (strcmp(pCtrl->data,"4lpi")==0) {
  777.         sum_arg[0] = SUMMA_RES_4LPI;
  778.         sum_arg[1] = '\0';
  779. #if DBGLEVEL >= 3
  780.         sprintf(dbg_str,"res-4lpi\n");
  781.         dbg_print(dbg_str);
  782. #endif
  783.         sum_command(sum,sum_arg);
  784.        }
  785.        else if (strcmp(pCtrl->data,"100lpi")==0) {
  786.         sum_arg[0] = SUMMA_RES_100LPI;
  787.         sum_arg[1] = '\0';
  788. #if DBGLEVEL >= 3
  789.         sprintf(dbg_str,"res-100lpi\n");
  790.         dbg_print(dbg_str);
  791. #endif
  792.         sum_command(sum,sum_arg);
  793.        }
  794.        else if (strcmp(pCtrl->data,"200lpi")==0) {
  795.         sum_arg[0] = SUMMA_RES_200LPI;
  796.         sum_arg[1] = '\0';
  797. #if DBGLEVEL >= 3
  798.         sprintf(dbg_str,"res-200lpi\n");
  799.         dbg_print(dbg_str);
  800. #endif
  801.         sum_command(sum,sum_arg);
  802.        }
  803.        else if (strcmp(pCtrl->data,"400lpi")==0) {
  804.         sum_arg[0] = SUMMA_RES_400LPI;
  805.         sum_arg[1] = '\0';
  806. #if DBGLEVEL >= 3
  807.         sprintf(dbg_str,"res-400lpi\n");
  808.         dbg_print(dbg_str);
  809. #endif
  810.         sum_command(sum,sum_arg);
  811.        }
  812.        else if (strcmp(pCtrl->data,"500lpi")==0) {
  813.         sum_arg[0] = SUMMA_RES_500LPI;
  814.         sum_arg[1] = '\0';
  815. #if DBGLEVEL >= 3
  816.         sprintf(dbg_str,"res-500lpi\n");
  817.         dbg_print(dbg_str);
  818. #endif
  819.         sum_command(sum,sum_arg);
  820.        }
  821.        else if (strcmp(pCtrl->data,"1000lpi")==0) {
  822.         sum_arg[0] = SUMMA_RES_1000LPI;
  823.         sum_arg[1] = '\0';
  824. #if DBGLEVEL >= 3
  825.         sprintf(dbg_str,"res-1000lpi\n");
  826.         dbg_print(dbg_str);
  827. #endif
  828.         sum_command(sum,sum_arg);
  829.        }
  830.        else if (strcmp(pCtrl->data,"10lpmm")==0) {
  831.         sum_arg[0] = SUMMA_RES_10LPMM;
  832.         sum_arg[1] = '\0';
  833. #if DBGLEVEL >= 3
  834.         sprintf(dbg_str,"res-10lpmm\n");
  835.         dbg_print(dbg_str);
  836. #endif
  837.         sum_command(sum,sum_arg);
  838.        }
  839.        else if (strcmp(pCtrl->data,"20lpmm")==0) {
  840.         sum_arg[0] = SUMMA_RES_20LPMM;
  841.         sum_arg[1] = '\0';
  842. #if DBGLEVEL >= 3
  843.         sprintf(dbg_str,"res-20lpmm\n");
  844.         dbg_print(dbg_str);
  845. #endif
  846.         sum_command(sum,sum_arg);
  847.        }
  848.        else if (strcmp(pCtrl->data,"40lpmm")==0) {
  849.         sum_arg[0] = SUMMA_RES_40LPMM;
  850.         sum_arg[1] = '\0';
  851. #if DBGLEVEL >= 3
  852.         sprintf(dbg_str,"res-40lpmm\n");
  853.         dbg_print(dbg_str);
  854. #endif
  855.         sum_command(sum,sum_arg);
  856.        }
  857.            else {
  858.         int y_val,x_val = atoi(pCtrl->data);
  859.         char *str= pCtrl->data;
  860. #if DBGLEVEL >= 3
  861.         sprintf(dbg_str,"x_val = %d, y_val = %d\n", x_val, y_val);
  862.         dbg_print(dbg_str);
  863. #endif
  864.                 while ((*str)&&(isdigit(*str)))
  865.                     str++;
  866.         if (*str=='/') {
  867. #if DBGLEVEL >= 3
  868.             sprintf(dbg_str,"Pixel values\n");
  869.             dbg_print(dbg_str);
  870. #endif
  871.             str++;
  872.             if (isdigit(*str)) {
  873.             x_res = x_val;
  874.                         y_res = atoi(str);
  875. #if DBGLEVEL >= 3
  876.                 sprintf(dbg_str,"x_res = %d, y_res = %d\n", x_res, y_res);
  877.                 dbg_print(dbg_str);
  878. #endif
  879.                         if (sum->model == 961) {
  880. #if DBGLEVEL >= 4
  881.                sprintf(dbg_str,"model is 961\n");
  882.                    dbg_print(dbg_str);
  883. #endif
  884.                            if (sum->origin == SUMMA_ORIGIN_LOWER) {
  885.                                 x_res = (x_res/6 + 1) * 6;
  886.                                 if (x_res > 6 * 508)
  887.                                     x_res = 6 * 508;
  888.                                 y_res = (y_res/9 + 1) * 9;
  889.                                 if (y_res > 9 * 508)
  890.                                     y_res = 9 * 508; 
  891.                             }
  892.                             else if (sum->origin == SUMMA_ORIGIN_UPPER) {
  893.                                 x_res = (x_res/9 + 1) * 9;
  894.                                 if (x_res > 9 * 508)
  895.                                     x_res = 9 * 508;
  896.                                 y_res = (y_res/6 + 1) * 6;
  897.                                 if (y_res > 6 * 508)
  898.                                     y_res = 6 * 508;
  899.                             }  
  900.                         }
  901.                         else if (sum->model == 1201) {
  902. #if DBGLEVEL >= 4
  903.                 sprintf(dbg_str,"model is 1201\n");
  904.                     dbg_print(dbg_str);
  905. #endif
  906.                             x_res = (((100 * x_res)/117 + 10) * 117)/100;
  907.                             if (10 * x_res > 117 * 508)
  908.                                 x_res = (117 * 508)/10;
  909.                             y_res = (((100 * y_res)/117 + 10) * 117)/100;
  910.                             if (10 * y_res > 117 * 508)
  911.                                 y_res = (117 * 508)/10;  
  912.                         }
  913.  
  914.             p = sum_string;
  915.  
  916.             sum_string[0] = 'r';
  917.             sum_string[9] = '\0';
  918.  
  919.             x_res_low = x_res & 0x00FF;
  920.             if (x_res_low < 0x10)
  921.                 sprintf(p+1,"0%x", x_res_low);
  922.             else
  923.                 sprintf(p+1,"%x", x_res_low);
  924.  
  925.             x_res_hi  = x_res >> 8;
  926.             if (x_res_hi < 0x10)
  927.                 sprintf(p+3,"0%x", x_res_hi);
  928.             else
  929.                 sprintf(p+3,"%x", x_res_hi);
  930.  
  931.             y_res_low = y_res & 0x00FF;
  932.             if (y_res_low < 0x10)
  933.                 sprintf(p+5,"0%x", y_res_low);
  934.             else
  935.                 sprintf(p+5,"%x", y_res_low);
  936.  
  937.             y_res_hi  = y_res >> 8;
  938.             if (y_res_hi < 0x10)
  939.                 sprintf(p+7,"0%x", y_res_hi);
  940.             else
  941.                 sprintf(p+7,"%x", y_res_hi);
  942.  
  943. #if DBGLEVEL >= 3
  944.                 sprintf(dbg_str,"%s\n", sum_string);   
  945.                 dbg_print(dbg_str);
  946.                         sprintf(dbg_str,"Pixel x res value: %d\n", x_res);
  947.                 dbg_print(dbg_str);
  948.                         sprintf(dbg_str,"Pixel y res value: %d\n", y_res);
  949.                 dbg_print(dbg_str);
  950. #endif
  951.                 sum_command(sum,sum_string);  
  952.             }
  953.             else
  954.                         cmn_err(CE_WARN,"Resolution format incorrect.\n"); 
  955.         }
  956.         else if (*str=='|') {
  957. #if DBGLEVEL >= 3
  958.             sprintf(dbg_str,"LPI values\n");
  959.             dbg_print(dbg_str);
  960. #endif
  961.             str++;
  962.             if (isdigit(*str)) {
  963.                 x_lpi = x_val;
  964.                 y_lpi = atoi(str);
  965.                         if (x_lpi > 508)
  966.                             x_lpi = 508;
  967.                         if (y_lpi > 508)
  968.                             y_lpi = 508;
  969.                         if (sum->model = 961) {
  970.                             if (sum->origin == SUMMA_ORIGIN_LOWER) {
  971.                                 x_res = x_lpi * 6;
  972.                                 y_res = y_lpi * 9;
  973.                             }
  974.                             else if (sum->origin == SUMMA_ORIGIN_UPPER) {
  975.                                 x_res = x_lpi * 9;
  976.                                 y_res = y_lpi * 6;
  977.                             }
  978.                         }
  979.                         else if (sum->model == 1201) {
  980.                             x_res = (((100 * x_res)/117 + 10) * 117)/10;
  981.                             y_res = (((100 * y_res)/117 + 10) * 117)/10;
  982.                         }
  983.  
  984.             p = sum_string;
  985.  
  986.             sum_string[0] = 'r';
  987.             sum_string[9] = '\0';
  988.  
  989.             x_res_low = x_res & 0x00FF;
  990.             if (x_res_low < 0x10)
  991.                 sprintf(p+1,"0%x", x_res_low);
  992.             else
  993.                 sprintf(p+1,"%x", x_res_low);
  994.  
  995.             x_res_hi  = x_res >> 8;
  996.             if (x_res_hi < 0x10)
  997.                 sprintf(p+3,"0%x", x_res_hi);
  998.             else
  999.                 sprintf(p+3,"%x", x_res_hi);
  1000.  
  1001.             y_res_low = y_res & 0x00FF;
  1002.             if (y_res_low < 0x10)
  1003.                 sprintf(p+5,"0%x", y_res_low);
  1004.             else
  1005.                 sprintf(p+5,"%x", y_res_low);
  1006.  
  1007.             y_res_hi  = y_res >> 8;
  1008.             if (y_res_hi < 0x10)
  1009.                 sprintf(p+7,"0%x", y_res_hi);
  1010.             else
  1011.                 sprintf(p+7,"%x", y_res_hi);
  1012.  
  1013. #if DBGLEVEL >= 3
  1014.                         sprintf(dbg_str,"LPI x res value: %d\n", x_res);
  1015.             dbg_print(dbg_str);
  1016.                         sprintf(dbg_str,"LPI y res value: %d\n", y_res);
  1017.             dbg_print(dbg_str);
  1018. #endif
  1019.                         sum_command(sum,sum_string); 
  1020.             }
  1021.             else
  1022.                         cmn_err(CE_WARN,"Resolution format incorrect.\n"); 
  1023.         }
  1024.         else
  1025.                     cmn_err(CE_WARN,"Resolution format incorrect.\n");
  1026.        }    
  1027.         }
  1028.  
  1029.     else if (strcmp(pCtrl->name,"buttons")==0) {
  1030. #if DBGLEVEL >= 2
  1031.        sprintf(dbg_str,"buttons\n");
  1032.        dbg_print(dbg_str);
  1033. #endif
  1034.            if (strcmp(pCtrl->data,"2")==0) 
  1035.         sum->info.bInfo.nBtn = 2;
  1036.        else if (strcmp(pCtrl->data,"4")==0) 
  1037.         sum->info.bInfo.nBtn = 4;
  1038.        else if (strcmp(pCtrl->data,"5")==0) 
  1039.         sum->info.bInfo.nBtn = 5;
  1040.        else
  1041.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  1042.     }
  1043.  
  1044.         else if (strncmp(pCtrl->name,"scale",5)==0) {
  1045.                 idevTransform *pTrans= NULL;
  1046. #if DBGLEVEL >= 2
  1047.         sprintf(dbg_str,"scale\n");
  1048.         dbg_print(dbg_str);
  1049. #endif
  1050.                 if ((pCtrl->name[5]=='x')||(pCtrl->name[5]=='X')) {
  1051.                         pTrans= &sum->info.pInfo.xTransform;
  1052. #if DBGLEVEL >= 3
  1053.             sprintf(dbg_str,"Doing X scale operation.\n");
  1054.                 dbg_print(dbg_str);
  1055. #endif
  1056.         }
  1057.                 else if ((pCtrl->name[5]=='y')||(pCtrl->name[5]=='Y')) {
  1058.                         pTrans= &sum->info.pInfo.yTransform;
  1059. #if DBGLEVEL >= 3
  1060.             sprintf(dbg_str,"Doing Y scale operation.\n");
  1061.                 dbg_print(dbg_str);
  1062. #endif
  1063.         }
  1064.                 else if (isdigit(pCtrl->name[5])) {
  1065.                         unsigned n= atoi(&pCtrl->name[5]);
  1066.                         if (n<sum->info.vInfo.nVal)
  1067.                                 pTrans= &sum->info.vInfo.transform[n];
  1068. #if DBGLEVEL >= 3
  1069.             sprintf(dbg_str,"Doing numbered scale operation.\n");
  1070.                 dbg_print(dbg_str);
  1071. #endif
  1072.                 }
  1073.                 if ((pTrans!=NULL)&&(isdigit(pCtrl->data[0]))) {
  1074.                         int denom,num= atoi(pCtrl->data);
  1075.                         char *str= pCtrl->data;
  1076.                         while ((*str)&&(isdigit(*str)))
  1077.                                 str++;
  1078.                         if (*str=='/')
  1079.                                 str++;
  1080.                         if (isdigit(*str))
  1081.                                 denom= atoi(str);
  1082.                         else    denom= 1;
  1083.                         if (num==0)     num= 1;
  1084.                         if (denom==0)   denom= 1;
  1085.  
  1086.                         pTrans->numerator= num;
  1087.                         pTrans->denominator= denom;
  1088.                 }
  1089.     }
  1090.  
  1091.     else if (strcmp(pCtrl->name,"tablet")==0) {
  1092. #if DBGLEVEL >= 2
  1093.             sprintf(dbg_str,"tablet\n");
  1094.             dbg_print(dbg_str);
  1095. #endif
  1096.         if (strcmp(pCtrl->data,"0")==0) {
  1097.         sum_arg[0] = SUMMA_0;
  1098.         sum_arg[1] = '\0';
  1099. #if DBGLEVEL >= 3
  1100.         sprintf(dbg_str,"tablet-select0\n");
  1101.                 dbg_print(dbg_str);
  1102. #endif
  1103.         sum_command(sum,sum_arg);
  1104.         }
  1105.         else if (strcmp(pCtrl->data,"1")==0) {
  1106.         sum_arg[0] = SUMMA_1;
  1107.         sum_arg[1] = '\0';
  1108. #if DBGLEVEL >= 3
  1109.         sprintf(dbg_str,"tablet-select1\n");
  1110.                 dbg_print(dbg_str);
  1111. #endif
  1112.         sum_command(sum,sum_arg);
  1113.         }
  1114.         else
  1115.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  1116.     }
  1117.  
  1118.     else if (strcmp(pCtrl->name,"control")==0) {
  1119. #if DBGLEVEL >= 2
  1120.             sprintf(dbg_str,"control\n");
  1121.             dbg_print(dbg_str);
  1122. #endif
  1123.         if (strcmp(pCtrl->data, "xon")==0) {
  1124.         sum_arg[0] = SUMMA_XON;
  1125.         sum_arg[1] = '\0';
  1126. #if DBGLEVEL >= 3
  1127.         sprintf(dbg_str,"control-xon\n");
  1128.                 dbg_print(dbg_str);
  1129. #endif
  1130.         sum_command(sum,sum_arg);
  1131.         }
  1132.         else if (strcmp(pCtrl->data,"xoff")==0) {
  1133.         sum_arg[0] = SUMMA_XOFF;
  1134.         sum_arg[1] = '\0';
  1135. #if DBGLEVEL >= 3
  1136.         sprintf(dbg_str,"control-xoff\n");
  1137.                 dbg_print(dbg_str);
  1138. #endif
  1139.         sum_command(sum,sum_arg);
  1140.         }
  1141.         else if (strcmp(pCtrl->data,"reset")==0) {
  1142.         sum_arg[0] = SUMMA_RESET;
  1143.         sum_arg[1] = '\0'; 
  1144.         sum_reset(sum);
  1145.         }
  1146.         else
  1147.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  1148.     }
  1149.  
  1150.     else if (strcmp(pCtrl->name,"diag")==0) {
  1151. #if DBGLEVEL >= 2
  1152.             sprintf(dbg_str,"diag\n");
  1153.             dbg_print(dbg_str);
  1154. #endif
  1155.         if (strcmp(pCtrl->data, "selftest")==0) {
  1156.         sum_arg[0] = SUMMA_SELFTEST;
  1157.         sum_arg[1] = '\0';
  1158. #if DBGLEVEL >= 3
  1159.         sprintf(dbg_str,"diag-selftest\n");
  1160.                 dbg_print(dbg_str);
  1161. #endif
  1162.         sum_command(sum,sum_arg);
  1163.         }
  1164.         else if (strcmp(pCtrl->data, "test_results")==0) {
  1165.         sum->data = SUMMA_TEST_RESULTS;
  1166.         sum_arg[0] = SUMMA_SEND_RESULTS;
  1167.         sum_arg[1] = '\0';
  1168. #if DBGLEVEL >= 3
  1169.         sprintf(dbg_str,"diag-test-results\n");
  1170.                 dbg_print(dbg_str);
  1171. #endif
  1172.         sum_command(sum,sum_arg);
  1173.         }
  1174.         else if (strcmp(pCtrl->data,"echo")==0) {
  1175.         sum->data = SUMMA_ECHO;
  1176.         sum_arg[0] = SUMMA_ECHO;
  1177.         sum_arg[1] = '\0';
  1178. #if DBGLEVEL >= 3
  1179.         sprintf(dbg_str,"diag-echo\n");
  1180.                 dbg_print(dbg_str);
  1181. #endif
  1182.         sum_command(sum,sum_arg);
  1183.         }
  1184.         else if (strcmp(pCtrl->data, "codecheck")==0) {
  1185.         sum->data = SUMMA_CODECHECK;
  1186.         sum_arg[0] = SUMMA_CODECHECK;
  1187.         sum_arg[1] = '\0';
  1188. #if DBGLEVEL >= 3
  1189.         sprintf(dbg_str,"diag-codecheck\n");
  1190.                 dbg_print(dbg_str);
  1191. #endif
  1192.         sum_command(sum,sum_arg);
  1193.         }
  1194.         else if (strcmp(pCtrl->data, "get_config")==0) {
  1195.         sum->data = SUMMA_CONFIG_INFO;
  1196.         sum_arg[0] = SUMMA_GET_CONFIG;
  1197.         sum_arg[1] = '\0';
  1198. #if DBGLEVEL >= 3
  1199.         sprintf(dbg_str,"diag-getconfig\n");
  1200.                 dbg_print(dbg_str);
  1201. #endif
  1202.         sum_command(sum,sum_arg);
  1203.         }
  1204.         else if (strcmp(pCtrl->data, "read_config")==0) {
  1205.         }
  1206.         else
  1207.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  1208.     }
  1209.  
  1210.     else if (strncmp(pCtrl->name,"offset",6)==0) {
  1211. #if DBGLEVEL >= 2
  1212.             sprintf(dbg_str,"offset\n");
  1213.             dbg_print(dbg_str);
  1214. #endif
  1215.             if ((pCtrl->name[6]=='x')||(pCtrl->name[6]=='X')) {
  1216.         sum->xoffset = atoi (pCtrl->data);
  1217. #if DBGLEVEL >= 3
  1218.                 sprintf(dbg_str,"x offset: %d\n");
  1219.                 dbg_print(dbg_str);
  1220. #endif
  1221.         }
  1222.             else if ((pCtrl->name[6]=='y')||(pCtrl->name[6]=='Y')) {
  1223.         sum->yoffset = atoi (pCtrl->data);
  1224. #if DBGLEVEL >= 3
  1225.                 sprintf(dbg_str,"x offset: %d\n");
  1226.                 dbg_print(dbg_str);
  1227. #endif
  1228.         }
  1229.         else
  1230.                 cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
  1231.     }
  1232.         return 0;
  1233. }
  1234.  
  1235. #define SUM_INIT    "\040F\100Tj"
  1236.  
  1237. static int
  1238. sum_init( sum_state_t *sum )
  1239. {
  1240.         if (idevChangeLineSettings(&sum->info,NULL)) {
  1241.                 mblk_t *mbp;
  1242.  
  1243.                 if (mbp= allocb(strlen(SUM_INIT),BPRI_MED)) {
  1244.                         strcpy(mbp->b_wptr,SUM_INIT);
  1245.                         mbp->b_wptr+=   strlen(mbp->b_wptr);
  1246.                         putnext( sum->info.sInfo.wq, mbp );
  1247. #if DBGLEVEL >= 1
  1248.                     sprintf(dbg_str,"Tablet Initialized.\n");
  1249.             dbg_print(dbg_str);
  1250. #endif
  1251.                 }
  1252.                 else {
  1253.                         cmn_err(CE_WARN,"Couldn't allocate streams buffer -- tablet not initialized.\n");
  1254.                 }
  1255.         }
  1256.         return 0;
  1257. }
  1258.  
  1259.  
  1260. static int
  1261. sum_wioctl( idevInfo *pInfo, int cmd, int size, char *stuff, int *pFound )
  1262. {
  1263. sum_state_t *sum= (sum_state_t *)pInfo;
  1264. int    ok = 0, found = 0;
  1265.  
  1266.     switch ( cmd ) {
  1267.         case IDEVGETDEVICEDESC:
  1268.             found++;
  1269.             if (size>=sizeof(idevDesc)) {
  1270.                 *((idevDesc *)stuff)= _sum_desc;
  1271.                 ((idevDesc *)stuff)->nValuators= 
  1272.                             sum->vals.nValuators;
  1273.                 ok= 1;
  1274.             }
  1275.             break;
  1276.         case IDEVGETVALUATORDESC:
  1277.             found++;
  1278.             if (size>=sizeof(idevGetSetValDesc))
  1279.                 ok = idevGetValDesc(&sum->info,
  1280.                     (idevGetSetValDesc*)stuff);
  1281.             break;
  1282.         case IDEVPTRCONTROL:
  1283.             found++;
  1284.             if (size>=sizeof(idevPtrControl))
  1285.                 ok = idevSetPtrCtrl(&sum->info,
  1286.                     (idevPtrControl *)stuff);
  1287.             break;
  1288.         case IDEVGETBUTTONS:
  1289.             found++;
  1290.             if (size>=idevSize(SUMMA_NUM_BUTTONS)) {
  1291.                 stuff[0]= sum->bstate;
  1292.                 ok = 1;
  1293.             }
  1294.             break;
  1295.         case IDEVGETVALUATORS:
  1296.             found++;
  1297.             if (size>=sizeof(idevValuatorState))
  1298.                 ok = idevGetValState(&sum->info,
  1299.                         (idevValuatorState*)stuff);
  1300.             break;
  1301.         case IDEVENABLEBUTTONS:
  1302.             found++;
  1303.             if (size>=sizeof(idevBitVals)) {
  1304.                 idevBitVals *vals= (idevBitVals *)stuff;
  1305.                 ok= 1;
  1306.                 sum->bactive &= ~vals->mask[0];
  1307.                 sum->bactive |= (vals->mask[0]&vals->value[0]);
  1308.             }
  1309.             break;
  1310.         case IDEVENABLEVALUATORS:
  1311.             found++;
  1312.             if (size>=sizeof(idevBitVals)) {
  1313.                 idevBitVals *vals= (idevBitVals *)stuff;
  1314.                 ok= 1;
  1315.                 sum->vactive &= ~vals->mask[0];
  1316.                 sum->vactive |= (vals->mask[0]&vals->value[0]);
  1317.             }
  1318.             break;
  1319.         case IDEVSETVALUATORS:
  1320.             found++;
  1321.             if (size>=sizeof(idevValuatorState))
  1322.                 ok = idevGenValEvents(&sum->info,
  1323.                     (idevValuatorState *)stuff,
  1324.                     IDEV_NO_TRANSFORM|IDEV_VALS_ABSOLUTE
  1325.                     |QE_RESPONSE);
  1326.             break;
  1327.         case IDEVCHANGEVALUATORS:
  1328.             found++;
  1329.             if (size>=sizeof(idevValuatorState))
  1330.                 ok = idevGenValEvents(&sum->info,
  1331.                     (idevValuatorState *)stuff,
  1332.                     IDEV_NO_TRANSFORM|QE_RESPONSE);
  1333.             break;
  1334.         case IDEVSETVALUATORDESC:
  1335.             found++;
  1336.             if (size>=sizeof(idevGetSetValDesc)) {
  1337.                 ok = idevSetValDesc(&sum->info,
  1338.                     (idevGetSetValDesc *)stuff);
  1339.             }
  1340.             break;
  1341.         case IDEVSETPTRMODE:
  1342.             found++;
  1343.             if (size>=sizeof(idevPtrMode))
  1344.                 ok = idevSetPtrMode(&sum->info,
  1345.                     (idevPtrMode *)stuff);
  1346.             break;
  1347.         case IDEVSETPTRBOUNDS:
  1348.             found++;
  1349.             if (size>=sizeof(idevPtrBounds))
  1350.                 ok = idevSetPtrBounds(&sum->info,
  1351.                     (idevPtrBounds *)stuff);
  1352.             break;
  1353.         case IDEVSETPTR:
  1354.             found++;
  1355.             if (size>=sizeof(idevPtrVals))
  1356.                 ok = idevSetPtr(&sum->info,
  1357.                     (idevPtrVals *)stuff);
  1358.             break;
  1359.         case IDEVSETTRANSFORM:
  1360.             found++;
  1361.             if (size>=sizeof(idevGetSetTransform)) {
  1362.                 ok = idevSetTransform(&sum->info,
  1363.                     (idevGetSetTransform *)stuff);
  1364.             }
  1365.             break;
  1366.         case IDEVGETTRANSFORM:
  1367.             found++;
  1368.             if (size>=sizeof(idevGetSetTransform))
  1369.                 ok = idevGetTransform(&sum->info,
  1370.                     (idevGetSetTransform *)stuff);
  1371.             break;
  1372.         case IDEVOTHERCONTROL:
  1373.             found++;
  1374.             if (size==sizeof(idevOtherControl)) {
  1375.                 ok = sum_other_control(sum,
  1376.                     (idevOtherControl *)stuff);
  1377.             }
  1378.             else ok = 0;
  1379.             break;
  1380.         case IDEVINITDEVICE:
  1381.             found++;
  1382.             ok = sum_init(sum);
  1383.             break;
  1384.         default: /* send other msgs down */
  1385.             break; /* FALL THROUGH */
  1386.     }
  1387.     *pFound=    found;
  1388.     return ok && found;
  1389. }
  1390.  
  1391. /* ARGSUSED */
  1392. static int
  1393. sum_open( queue_t *rq, dev_t *dev, int flag, int sflag, struct cred *cred )
  1394. {
  1395.     register sum_state_t *sum;
  1396.     register int i;
  1397.  
  1398.     if ( sflag != MODOPEN )
  1399.         return ENXIO ;
  1400.  
  1401.     if ( !rq->q_ptr ) {
  1402.         if ( !(sum = (sum_state_t *)malloc(sizeof *sum)))
  1403.             return OPENFAIL;
  1404.  
  1405.         /* Set defaults -- totally arbitrary, my choice */
  1406.         bzero( sum, sizeof *sum ) ;
  1407.  
  1408.         sum->initialized = 1;
  1409.         sum->state = 0;
  1410.         sum->origin = SUMMA_ORIGIN_LOWER;
  1411.         sum->resolution = SUMMA_RES_1000LPI;
  1412.         sum->primary_mode = SUMMA_RPT_STREAM;
  1413.         sum->mode_modifier = SUMMA_RATE_MAX;
  1414.         sum->data = SUMMA_REGULAR_DATA;
  1415.         sum->model = 961;
  1416.         sum->xoffset = 0;
  1417.         sum->yoffset = 0;
  1418.         sum->vals.firstValuator = 0;
  1419.         sum->vals.nValuators = SUMMA_NUM_AXES;
  1420.         sum->vdesc[0]= _sum_x_val_desc;
  1421.         sum->vstate[0]= 0;
  1422.         sum->vtrans[0] = idevDfltScale;
  1423.         sum->vtrans[0].possible = IDEV_SCALE;
  1424.         sum->vtrans[0].which = IDEV_SCALE;
  1425.  
  1426.         sum->vdesc[1]= _sum_y_val_desc;
  1427.         sum->vstate[1]= 0;
  1428.         sum->vtrans[1] = idevDfltScale;
  1429.         sum->vtrans[1].possible = IDEV_SCALE;
  1430.         sum->vtrans[1].which = IDEV_SCALE;
  1431.         sum->vactive=    SUMMA_ALL_VALUATORS;
  1432.         sum->bstate=    0;
  1433.         sum->bactive=    SUMMA_ALL_BUTTONS;
  1434.  
  1435.         sum->info.bInfo.nBtn = SUMMA_NUM_BUTTONS;
  1436.         sum->info.bInfo.active = &sum->bactive;
  1437.         sum->info.bInfo.state = &sum->bstate;
  1438.  
  1439.         sum->info.vInfo.nVal = SUMMA_NUM_AXES;
  1440.         sum->info.vInfo.sysValue = sum->vstate;
  1441.         sum->info.vInfo.desc = sum->vdesc;
  1442.         sum->info.vInfo.transform = sum->vtrans;
  1443.         sum->info.vInfo.active = &sum->vactive;
  1444.         sum->info.vInfo.mode = IDEV_GEN_NON_PTR_EVENTS;
  1445.         sum->info.pInfo.xTransform = idevDfltScale;
  1446.         sum->info.pInfo.yTransform = idevDfltScale;
  1447.         sum->info.pInfo.yTransform.flags= IDEV_INVERT;
  1448.  
  1449.         sum->info.pInfo.xAxis = sum->info.pInfo.yAxis = 255;
  1450.         sum->info.pInfo.minX = sum->info.pInfo.minY = 0;
  1451.         sum->info.pInfo.maxX = sum->info.pInfo.maxY = 0;
  1452.         sum->info.pInfo.x= sum->info.pInfo.y= 0;
  1453.  
  1454.         sum->info.sInfo.shmiqid.devminor = 0;
  1455.         sum->info.sInfo.shmiqid.index = 0;
  1456.         sum->info.sInfo.rq = rq;
  1457.         sum->info.sInfo.wq =    WR(rq);
  1458.         sum->info.sInfo.readData = sum_intr;
  1459.         sum->info.sInfo.writeIoctl = sum_wioctl;
  1460.         WR(rq)->q_ptr =    rq->q_ptr = (caddr_t) &sum->info;
  1461.     }
  1462.  
  1463.     return 0;
  1464. }
  1465.  
  1466. /* ARGSUSED */
  1467. static int
  1468. sum_close( queue_t *rq, int flag, struct cred *cred )
  1469. {
  1470.     sum_state_t *sum = (sum_state_t *)rq->q_ptr;
  1471.  
  1472.     ASSERT( rq->q_ptr );
  1473.     free( (char *)sum );
  1474.     return 0;
  1475. }
  1476.  
  1477.  
  1478.  
  1479.     /*
  1480.      * stream module definition
  1481.      */
  1482.  
  1483. static struct module_info sum_mod_info = {
  1484.     0,                /* module ID */
  1485.     SUMMA_NAME,            /* module name */
  1486.     0,                /* minimum packet size */
  1487.     INFPSZ,                /* infinite maximum packet size */
  1488.     256,                /* hi-water mark */
  1489.     16,                /* lo-water mark */
  1490. };
  1491.  
  1492. static struct qinit sum_rinit = {
  1493.     idev_rput, NULL, sum_open, sum_close,
  1494.     NULL, &sum_mod_info, NULL
  1495. };
  1496.  
  1497. static struct qinit sum_winit = {
  1498.     idev_wput, NULL, NULL, NULL,
  1499.     NULL, &sum_mod_info, NULL
  1500. } ;
  1501.  
  1502. /* ********************* Only visible STREAMS structure ********************* */
  1503. struct streamtab summainfo = {
  1504.     &sum_rinit, &sum_winit, 0, 0
  1505. } ;
  1506.